home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 061-070 / amok63 / m2ced / txt.lha / TimerSupport.mod < prev    next >
Text File  |  1991-11-13  |  5KB  |  190 lines

  1. (**********************************************************************
  2.  
  3.     :Program.    TimerSupport.mod
  4.     :Contents.   support to handle the timer.device
  5.     :Author.     Hartmut Höhn
  6.     :Address.    Friedenstraße 1, D 6255 Dornburg 5
  7.     :Copyright.  Public Domain
  8.     :Language.   Modula-2
  9.     :Translator. M2Amiga A+L V3.2d
  10.     :History.    V1.0 Harmut Höhn 27.Dec.1988
  11.     :History.    V1.1 [bne] 18.May.1989 (- MODIV, cosmetics)
  12.     :History.    V1.2 [bne] 29.May.1989 (bugs fixed, compiler V3.2)
  13.     :History.    V2.0 [bne] 06.Aug.1989 (+ inline doc, optimized)
  14.     :History.    V2.1 [bne] 03.Sep.1989 (new Add/Sub/CmpTime)
  15.  
  16. **********************************************************************)
  17. (*$ StackParms:=FALSE Volatile:=FALSE CaseChk:=FALSE *)
  18. (*$ StackChk:=FALSE RangeChk:=FALSE OverflowChk:=FALSE NilChk:=FALSE *)
  19. IMPLEMENTATION MODULE TimerSupport;
  20.  
  21. (* Copyright (c) 1988, 1989 by Hartmut Höhn & Nicolas Benezan *)
  22.  
  23. FROM Arts        IMPORT Assert;
  24. FROM ExecD       IMPORT invalid, MsgPortPtr,DevicePtr;
  25. FROM ExecL       IMPORT CloseDevice, DoIO, OpenDevice;
  26. FROM ExecSupport IMPORT CreateExtIO, CreatePort, DeleteExtIO, DeletePort;
  27. FROM SYSTEM      IMPORT ADR, LONGSET;
  28. FROM Timer       IMPORT addRequest, getSysTime, IOTimer, IOTimerPtr,
  29.                         setSysTime, timerName, TimeVal;
  30. IMPORT Timer;
  31.  
  32. VAR
  33.   timerBase  : DevicePtr;
  34.   timerReqPtr: IOTimerPtr;
  35.   open       : INTEGER;
  36.  
  37. CONST
  38.   micPerSec   = 1000000;
  39.   secsPerMin  = 60;
  40.   minsPerHour = 60;
  41.   hoursPerDay = 24;
  42.   daysPerYear = 365;
  43.   daysPerLeap = 4*daysPerYear+1;
  44.   notOpen     = "timer.device not open";
  45.  
  46. PROCEDURE CloseTimer;
  47.   BEGIN
  48.     DEC(open);
  49.     IF open=0 THEN
  50.       CloseDevice(timerReqPtr);
  51.       DeleteExtIO(timerReqPtr);
  52.       DeletePort(timerPort);
  53.     END;
  54.   END CloseTimer;
  55.  
  56. PROCEDURE OpenTimer(Mode: TimerMode): BOOLEAN;
  57.   BEGIN
  58.     IF open=0 THEN
  59.       timerPort:=CreatePort(NIL, 0);
  60.       IF timerPort#NIL THEN
  61.         timerReqPtr:=CreateExtIO(timerPort, SIZE(IOTimer));
  62.         IF timerReqPtr#NIL THEN
  63.           OpenDevice(ADR(timerName), ORD(Mode), timerReqPtr, LONGSET{});
  64.           IF timerReqPtr^.node.error=0 THEN
  65.             INC(open);
  66.             timerBase:=timerReqPtr^.node.device;
  67.             RETURN TRUE;
  68.           END;
  69.           DeleteExtIO(timerReqPtr);
  70.         END;
  71.         DeletePort(timerPort);
  72.       END;
  73.       RETURN FALSE
  74.     END;
  75.     INC(open);
  76.     RETURN TRUE
  77.   END OpenTimer;
  78.  
  79. PROCEDURE TimerWait(Time: TimeVal);
  80.   BEGIN
  81.     Assert(open>0, ADR(notOpen));
  82.     WITH timerReqPtr^ DO
  83.       node.command:=addRequest;
  84.       time:=Time;
  85.     END;
  86.     DoIO(timerReqPtr);
  87.   END TimerWait;
  88.  
  89. PROCEDURE GetSysTime(VAR Time: TimeVal);
  90.   BEGIN
  91.     Assert(open>0, ADR(notOpen));
  92.     timerReqPtr^.node.command:=getSysTime;
  93.     DoIO(timerReqPtr);
  94.     Time:=timerReqPtr^.time
  95.   END GetSysTime;
  96.  
  97. PROCEDURE SetSysTime(Time: TimeVal);
  98.   BEGIN
  99.     Assert(open>0, ADR(notOpen));
  100.     WITH timerReqPtr^ DO
  101.       node.command:=setSysTime;
  102.       time:=Time;
  103.     END;
  104.     DoIO(timerReqPtr);
  105.   END SetSysTime;
  106.  
  107. PROCEDURE SysToNormalTime(    SysTime: TimeVal;
  108.                           VAR Year, Month, Day: LONGINT;
  109.                           VAR Hour, Minute, Second: LONGINT);
  110.   BEGIN
  111.     Second:=SysTime.secs;
  112.     Minute:=Second DIV secsPerMin;
  113.     Second:=Second MOD secsPerMin;
  114.     Hour:=Minute DIV minsPerHour;
  115.     Minute:=Minute MOD minsPerHour;
  116.     Day:=Hour DIV hoursPerDay;
  117.     Hour:=Hour MOD hoursPerDay;
  118.     DEC(Day, 790);                    (* offset 1.Jan.78 to 1.Mar.1980 *)
  119.     Year:=(4*Day+3) DIV daysPerLeap;
  120.     DEC(Day, daysPerLeap*Year DIV 4);
  121.     Month:=(5*Day+2) DIV 153;         (* 0=Mar ... 11=Feb next year *)
  122.     DEC(Day,(153*Month+2) DIV 5);
  123.     INC(Day);
  124.     INC(Month, 3);                    (* Mar=3 ... next Feb=14 *)
  125.     IF Month>12 THEN
  126.       INC(Year);
  127.       DEC(Month, 12);
  128.     END;
  129.     INC(Year, 1980);
  130.   END SysToNormalTime;
  131.  
  132. PROCEDURE NormalToSysTime(    Year, Month, Day: LONGINT;
  133.                               Hour, Minute, Second: LONGINT;
  134.                           VAR SysTime: TimeVal);
  135.   BEGIN
  136.     DEC(Year, 1980);
  137.     DEC(Month, 3);                    (* 0=Mar ... 11=Feb next year *)
  138.     IF Month<0 THEN
  139.       INC(Month, 12);
  140.       DEC(Year);
  141.     END;
  142.     DEC(Day);
  143.     INC(Day, (153*Month+2) DIV 5);
  144.     INC(Day, daysPerLeap*Year DIV 4);
  145.     INC(Day, 790);
  146.     INC(Hour, Day*hoursPerDay);
  147.     INC(Minute, Hour*minsPerHour);
  148.     INC(Second, Minute*secsPerMin);
  149.     WITH SysTime DO
  150.       secs:=Second;
  151.       micro:=0;
  152.     END;
  153.   END NormalToSysTime;
  154.  
  155. PROCEDURE NewTimerRequest(RequestPtr: IOTimerPtr);
  156.   BEGIN
  157.     Assert(open>0, ADR(notOpen));
  158.     RequestPtr^:=timerReqPtr^;
  159.     WITH RequestPtr^.node DO
  160.       command:=invalid;
  161.       error:=0;
  162.     END;
  163.   END NewTimerRequest;
  164.  
  165. PROCEDURE AddTime(VAR dest: TimeVal;
  166.                       source: TimeVal);
  167.   BEGIN
  168.     Assert(open>0, ADR(notOpen));
  169.     Timer.AddTime(timerBase, ADR(dest), ADR(source));
  170.   END AddTime;
  171.  
  172. PROCEDURE SubTime(VAR dest: TimeVal;
  173.                       source: TimeVal);
  174.   BEGIN
  175.     Assert(open>0, ADR(notOpen));
  176.     Timer.SubTime(timerBase, ADR(dest), ADR(source));
  177.   END SubTime;
  178.  
  179. PROCEDURE CmpTime(time1, time2: TimeVal): INTEGER;
  180.   BEGIN
  181.     Assert(open>0, ADR(notOpen));
  182.     RETURN Timer.CmpTime(timerBase, ADR(time1), ADR(time2));
  183.   END CmpTime;
  184.  
  185. BEGIN
  186.   open:=0;
  187.   CLOSE
  188.   CloseTimer;
  189. END TimerSupport.
  190.